package com.easonji.common.util;

import java.util.Arrays;

/**
 * @ClassName: CollectionUtils
 * @Description: 集合相关工具类，包括数组
 * @Author: LiuJun
 * @date: 2018/07/09 12:12
 * @Version: 1.0
 * @Copyright: Copyright (c) 2018 - 2019
 */
public class CollectionUtils {

    /**
     * 创建一个新的实例 CollectionUtils.
     */
    private CollectionUtils() {
    }

    /**
     * 数组是否为空
     * 
     * @param array
     *            数组
     * @return 是否为空
     */
    public static <T> boolean isEmpty(T[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 数组是否为非空
     * 
     * @param array
     *            数组
     * @return 是否为非空
     */
    public static <T> boolean isNotEmpty(T[] array) {
        return !isEmpty(array);
    }

    /**
     * 判定给定对象是否为数组类型
     * 
     * @param obj
     *            对象
     * @return 是否为数组类型
     */
    public static boolean isArray(Object obj) {
        return obj.getClass().isArray();
    }

    /**
     * 数组或集合转String
     * 
     * @param obj
     *            集合或数组对象
     * @return 数组字符串，与集合转字符串格式相同
     */
    public static String toString(Object obj) {
        if (null == obj) {
            return null;
        }
        if (isArray(obj)) {
            try {
                return Arrays.deepToString((Object[]) obj);
            } catch (Exception e) {
                final String className = obj.getClass().getComponentType().getName();
                switch (className) {
                case "long":
                    return Arrays.toString((long[]) obj);
                case "int":
                    return Arrays.toString((int[]) obj);
                case "short":
                    return Arrays.toString((short[]) obj);
                case "char":
                    return Arrays.toString((char[]) obj);
                case "byte":
                    return Arrays.toString((byte[]) obj);
                case "boolean":
                    return Arrays.toString((boolean[]) obj);
                case "float":
                    return Arrays.toString((float[]) obj);
                case "double":
                    return Arrays.toString((double[]) obj);
                default:
                    return null;
                }
            }
        }
        return obj.toString();
    }

    /**
     * 以 conjunction 为分隔符将集合转换为字符串
     * 
     * @param <T>
     *            被处理的集合
     * @param collection
     *            集合
     * @param conjunction
     *            分隔符
     * @return 连接后的字符串
     */
    public static <T> String join(Iterable<T> collection, String conjunction) {
        StringBuilder sb = new StringBuilder();
        boolean isFirst = true;
        for (T item : collection) {
            if (isFirst) {
                isFirst = false;
            } else {
                sb.append(conjunction);
            }
            sb.append(item);
        }
        return sb.toString();
    }

    /**
     * 以 conjunction 为分隔符将数组转换为字符串
     * 
     * @param <T>
     *            被处理的集合
     * @param array
     *            数组
     * @param conjunction
     *            分隔符
     * @return 连接后的字符串
     */
    public static <T> String join(T[] array, String conjunction) {
        StringBuilder sb = new StringBuilder();
        boolean isFirst = true;
        for (T item : array) {
            if (isFirst) {
                isFirst = false;
            } else {
                sb.append(conjunction);
            }
            sb.append(item);
        }
        return sb.toString();
    }
}
